class Solution {
public:
    // int mymin(int x,int y){
    //     return x<y?x:y;
    // }
    //判断递增的高度图能蓄积的雨水量
    int water(vector<int>& ptr){
        stack<int> prev;
        prev.push(0);
        int sum=0;//综合大小
        int num=0;//较大数之间的较小数大小
        for(int i=0;i<ptr.size();i++){
            if(ptr[i]>=ptr[prev.top()]){
                sum+=(i-prev.top()-1)*min(ptr[i],ptr[prev.top()])-num;
                if(sum<0){
                    sum=0;
                }
                num=0;
                prev.push(i);
            }else{
                num+=ptr[i];
            }
        }
        return sum;
    }
    int water1(vector<int>& ptr){
        stack<int> prev;
        prev.push(0);
        int sum=0;//综合大小
        int num=0;//较大数之间的较小数大小
        for(int i=1;i<ptr.size();i++){
            if(ptr[i]>ptr[prev.top()]){
                sum+=(i-prev.top()-1)*min(ptr[i],ptr[prev.top()])-num;
                if(sum<0){
                    sum=0;
                }
                num=0;
                prev.push(i);
            }else{
                num+=ptr[i];
            }
        }
        return sum;
    }
    //判断vector中的最大值，并判断最大值有奇数个还是偶数个
    int parity(vector<int>& ptr){
        int max=0;
        int count=0;
        //求出最大值
        for(int i=0;i<ptr.size();i++){
            if(ptr[i]>=max){
                max=ptr[i];
            }
        }
        //求最大值有几个
        for(int i=0;i<ptr.size();i++){
            if(ptr[i]==max){
                count++;
            }
        }
        return count;
    }

    int trap(vector<int>& height) {
        //需要判断最大值是奇数还是偶数
        if(height.empty()){
            return 0;
        }
        int sum=0;
        int num=0;
        int count=parity(height);

        vector<int> ptr(height);
        vector<int> rever_ptr(height);
        reverse(rever_ptr.begin(),rever_ptr.end());
        sum=water(rever_ptr)+water(ptr);
        if(count==1){
            return sum;
        }
        sum+=water1(rever_ptr)+water1(ptr);
        return sum/2;
    }
};